package main

import (
	"fmt"
	"github.com/fsnotify/fsnotify"
	"github.com/gin-gonic/gin"
	"github.com/spf13/viper"
)

type Config struct {
	Port        int    `mapstructure:"post"`
	Version     string `mapstructure:"version"`
	MysqlConfig `mapstructure:"mysql"`
}

type MysqlConfig struct {
	Host   string `mapstructure:"host"`
	DBName string `mapstructure:"dbname"`
	Port   int    `mapstructure:"port"`
}

func main() {

	viper.SetDefault("fileDir", "./")
	//viper.SetDefault("LayoutDir", "layouts")
	//viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})

	viper.SetConfigFile("config.yaml") // 指定配置文件路径
	viper.SetConfigName("config")      // 配置文件名称(无扩展名)
	viper.SetConfigType("yaml")        // 如果配置文件的名称中没有扩展名，则需要配置此项
	//viper.AddConfigPath("/etc/appname/")  // 查找配置文件所在的路径
	//viper.AddConfigPath("$HOME/.appname") // 多次调用以添加多个搜索路径
	viper.AddConfigPath(".")    // 还可以在工作目录中查找配置
	err := viper.ReadInConfig() // 查找并读取配置文件
	if err != nil {             // 处理读取配置文件的错误
		panic(fmt.Errorf("Fatal error config file: %s \n", err))
	}
	viper.WatchConfig() // 实时监控文件变化

	viper.OnConfigChange(func(e fsnotify.Event) {
		// 配置文件发生变更之后会调用的回调函数
		fmt.Println("Config file changed:", e.Name)
	})

	// 反序列化，配置文件中的值存储到变量中
	var c Config
	if err := viper.Unmarshal(&c); err != nil {
		fmt.Printf("序列化失败，err : %v\n", err)
		return
	}
	fmt.Println("从配置文件中读取的配置为：", c)
	// 打印出字段名字，不只是打印值这么简单
	fmt.Printf("从配置文件中读取的配置为：%#v\n", c)
	fmt.Printf("从配置文件中读取的配置为：%v\n", c)

	r := gin.Default()
	r.GET("/hello", func(c *gin.Context) {
		c.String(200, "你好，2022")
	})

	r.GET("/version", func(c *gin.Context) {
		c.String(200, viper.GetString("version"))
	})
	r.GET("/set", func(c *gin.Context) {
		key := c.Query("key")
		val := c.Query("val")
		println(key, val)
		// 此操作，没有改变文件中的值，知识改变了这个变量在此生命周期里的值
		viper.Set(key, val)
		c.String(200, "%s : %s", key, val)

	})
	r.GET("/get", func(c *gin.Context) {
		key := c.Query("key")
		if viper.IsSet(key) {
			c.String(200, viper.GetString(key))
		} else {
			c.String(404, "不存在！")
		}
	})

	r.Run(":9999")

}
